{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用SimpleTagBased算法对Delicious2K数据进行推荐\n",
    "# 原始数据集：https://grouplens.org/datasets/hetrec-2011/\n",
    "# 数据格式：userID     bookmarkID     tagID     timestamp\n",
    "import random\n",
    "import math\n",
    "import operator\n",
    "import pandas as pd\n",
    "\n",
    "file_path = \"./user_taggedbookmarks-timestamps.dat\"\n",
    "# 字典类型，保存了user对item的tag，即{userid: {item1:[tag1, tag2], ...}}\n",
    "records = {}\n",
    "# 训练集，测试集\n",
    "train_data = dict()\n",
    "test_data = dict()\n",
    "# 用户标签，商品标签\n",
    "user_tags = dict()\n",
    "tag_items = dict()\n",
    "user_items = dict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加一些dict\n",
    "item_tags = dict()\n",
    "tag_users = dict()\n",
    "item_users = dict()"
   ]
  },
  {
   "attachments": {
    "e25f8f36-646e-456f-b3f1-b612a3e2aa86.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxUAAAGUCAYAAABDbg9eAAAgAElEQVR4AeydL9Q0xfG2kUgkEolEIpFIZCQyEolDIpFIJBKJjIyMjIyMRCKf71zkd/NVKv2neqZnd5/du8/ZM7Oz/af6qurqqpl53veDNxcTMAETMAETMAETMAETMAETOEHggxNt3dQETMAETMAETMAETMAETMAE3pxU2AhMwARMwARMwARMwARMwAROEXBScQqfG5uACZiACZiACZiACZiACTipsA2YgAmYgAmYgAmYgAmYgAmcIuCk4hQ+NzYBEzABEzABEzABEzABE3BSYRswARMwARMwARMwARMwARM4RcBJxSl8bmwCJmACJmACJmACJmACJuCkwjZgAiZgAiZgAiZgAiZgAiZwioCTilP43NgETMAETMAETMAETMAETMBJhW3ABEzABEzABEzABEzABEzgFAEnFafwubEJmIAJmIAJmIAJmIAJmICTCtuACZiACZiACZiACZiACZjAKQJOKk7hc2MTMAETMAETMAETMAETMAEnFbYBEzABEzABEzABEzABEzCBUwScVJzC58YmYAImYAImYAImYAImYAJOKmwDJmACJmACJmACJmACJmACpwg4qTiFz41NwARMwARMwARMwARMwAScVDyIDfz+++8PIsn9xPj3v/99v8E9sgmYgAmYgAmYgAmYwGECTioW0F0Z9H7//fdvX3311ds//vGPBYnOV/3555/ffvvtt/Mdbejhp59+evvkk0/eOD5SQe9ff/31MicSxc8+++zt73//+7bpvELyeeU626YId2QCJmACJmACJvBfBJ4qqSAw53NFITD88MMPL+sfmf/yl7+8ffDBB2/ffPPN262CR4L4jz766O2vf/3rctC8mzPJBPPnA4ud5QxPbAqZPv3006UE4ddff/1zPvDdUb788su3b7/99u662jGXVh/Y/scff7zEudWPr5mACZiACZiACdyWwFMlFd99992fwd8XX3zxtvNDoKOAl7v7VxQCX42D7LcoJBXMizvx9y5KKri7fyYJyPPg6Q9cCfKPFOSR7leSVpjSjmR0l81wF1+J4A8//HBkOsM2v/zyy/D31o9wZY5itONIfzuf8LTk9jUTMAETMAETMIF9BJ4yqagEyP/617/+CIKqwbsCRO6kXlkIFBWUHQnwVmVTUvG3v/1t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QQqa8x3C0ZS5e5gDBvpZ+cPmUf+P8BuJBX+LJVb8LZXLf/4ZXdjwcdlLgID6mdgyF71aLj/TOrLGSDZayYL+VS2SCXzU6hPVsxpyUnGWoNubgAmYgAmYgAmYgAmYwAYC/A0iTyf48OSBD8kC30nWH/lVbycVGwzAXZiACZiACZiACZiACZjAKxNwUvHK2vfcTcAETMAETMAETMAETGADAScVGyC6CxMwARMwARMwARMwARN4ZQJOKl5Z+567CZiACZiACZiACZiACWwg4KRiA0R3YQImYAImYAImYAImYAKvTMBJxStr33M3ARMwARMwARMwARMwgQ0EnFRsgOguTMAETMAETMAETMAETOCVCTipeGXte+4mYAImYAImYAImYAImsIGAk4oNEN2FCZiACZiACZiACZiACbwyAScVr6x9z90ETMAETMAETMAETMAENhBwUrEBorswARMwARMwARMwARMwgVcm4KTilbXvuZuACZiACZiACZiACZjABgJOKjZAdBcmYAImYAImYAImYAIm8MoEnFS8svY9dxMwARMwARMwARMwARPYQMBJxQaI7sIETMAETMAETMAETMAEXpmAk4pX1r7nbgImYAImYAImYAImYAIbCDip2ADRXZiACZiACZiACZiACZjAKxNwUvHK2vfcTcAETMAETMAETMAETGADAScVGyC6CxMwARMwARMwARMwARN4ZQJOKl5Z+567CZiACZiACZiACZiACWwg4KRiA0R3YQImYAImYAImYAImYAKvTMBJxStr33M3ARMwARMwARMwARMwgQ0EnFRsgOguTMAETMAETMAETMAETOCVCTipeGXte+4mYAImYAImYAImYAImsIGAk4oNEN2FCZiACZiACZiACZiACbwyAScVr6x9z90ETMAETMAETMAETMAENhBwUrEBorswARMwARMwARMwARMwgVcm4KTilbXvuZuACZiACZiACZiACZjABgJOKjZAdBcmYAImYAImYAImYAIm8MoEnFS8svY9dxMwARMwARMwARMwARPYQMBJxQaI7sIETMAETMAETMAETMAEXpmAk4pX1r7nbgImYAImYAImYAImYAIbCDip2ADRXZiACZiACZiACZiACZjAKxNwUvHK2vfcTcAETMAETMAETMAETGADAScVGyC6CxMwARMwARMwARMwARN4ZQJOKl5Z+567CZiACZiACZiACZiACWwg4KRiA0R3YQImYAImYAImYAImYAKvTMBJxStr33M3ARMwARMwARMwARMwgQ0EnFRsgOguTMAETMAETMAETMAETOCVCTipeGXte+4mYAImYAImYAImYAImsIGAk4oNEN2FCZiACZiACZiACZiACbwyAScVr6x9z90ETMAETMAETMAETMAENhBwUrEBorswARMwARMwARMwARMwgVcm4KTiQbT/+++/P4gk71+MZ2f573//+/0ryTMwARMwARMwARN4KgJOKhbUeWUw9/3337999dVXb//4xz8WJDpf9eeff3777bffznf0QD18/fXXb3/5y1+2svzll1/+6PNf//pXeaZwRae77eann356++STT944PlJhnrBftSeSwM8+++zt73//+yNNx7KYgAmYgAmYgAksEHiqpILAnM8VhYDnww8/vKx/ZCYQ/uCDD96++eabt1vdbSc4/eijj97++te/LgeDOzgTiJLY7CzffvvtHxxhuSvwxq7oDxv47rvvSuKSiNAGvjvtkjnRLx9sZmc5Y3di9Omnny4lCL/++uuf88EOXUzABEzABEzABN4fgadKKgj2CLQIar744outn48//vjPwGd3ECyzIaDTOMh/i0JSATPuMN+jMOfPP//8j8+uO9WyA54S7CoEu3AiQag+rZActEOfZwL2OA8lFdzd39Un/fOUDPsjyD9SkIe58llJorA92pCwXbW2jszHbUzABEzABEzABOoEnjKpqATIBIYK9iq4FPjwFOHK8sMPP/wZmHGn++qipOJvf/vb9qEIqiuvwvC0gmCWoJL5ny0K5jnuKgqYVziRSGBjzG3nK1BKKkaJJxyZ/8qHhEnB/WpiQUJCWz49HZIAtTgokf7xxx+76sKOVth3O/IPJmACJmACJmAClxB4qqRCr19cmVTsep2mp00CLwVZq4Fdr8/R9auSCiVhBOOVxGJnMrU7qUB+guWVV40InhVk7777TnBN36OkgiAfHawkFbEua2nlKQhPhUYy0deXX375x9+CRHuozIX62BFJ563/5mi0dvybCdyKAP6EtRI/cR1dIQdrLY5XfZJ8laxH5bmCjfs0ARNoE3iqpEJ3cB81qSAobd2pzaohCJ3NgSCNQOtswDpKKhScKzg+eqwkFsyHoHEUmGZOve+Sm+OOwhMjZKvoTuMpwWXu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+RJU4UzYsEcBlsZgU7+X45EMlaOcD/NaCbLpmwCPdnCJryVUxr1FHfRKcNb6VANByamAsJpUqB1MSSa4855fQVKd6hHezOWorVfHWa3HXU0SKALvUTkiNwkNyRP9ryQUyCHb3r0OsR0lsLNEKvJADp4GtBKGWK93TruK3a5y6o3n6yZgAv+fgPyJk4r265n/n5TPTODt7d0mFQQylVeRdii5Og5Jx9kAcoe81T644380EIHJajJSleuR6jFPXsuZBc4tmbGFI+1afb3aNRLDo7YJdwL5K9hjC+9pjb+a3Xi+JrCbQEwquMmhm1WVm4xnZNE4HONroaM+d8p6ZPyRbP7tNQi826TiNdTjWZqACZiACTwrAYLUHa8wVp5kPSvDq+fFzTeeUuTP6HXGszIR0Ofx9H3U9y5Zj44/ks2/vQYBJxWvoWfP0gRMwARM4MEIKFA8e+QOtcs1BHgir9ceo56O/AMxVQl5ZTT+XZ7Gnb12uUvWo+NX5+d6z0vAScXz6tYzMwETMAETeGACBIk7nlRUX9F9YBQWzQRM4AkIOKl4AiV6CiZgAiZgAiZgAiZgAiZwTwJOKu5J32ObgAmYgAmYgAmYgAmYwBMQcFLxBEr0FEzABEzABEzABEzABEzgngScVNyTvsc2ARMwARMwARMwARMwgScg4KTiCZToKZiACZiACZiACZiACZjAPQk4qbgnfY9tAiZgAiZgAiZgAiZgAk9AwEnFEyjRUzABEzABEzABEzABEzCBexJwUnFP+h7bBEzABEzABEzABEzABJ6AgJOKJ1Cip2ACJmACJmACJmACJmAC9yTgpOKe9D22CZiACZiACZiACZiACTwBAScVT6BET8EETMAETMAETMAETMAE7knAScU96XtsEzABEzABEzABEzABE3gCAk4qnkCJnoIJmIAJmIAJmIAJmIAJ3JOAk4p70vfYJmACJmACJmACJmACJvAEBJxUPIESPQUTMAETMAETMAETMAETuCcBJxX3pO+xTcAETMAETMAETMAETOAJCDipeAIlegomYAImYAImYAImYAImcE8CTiruSd9jm4AJmIAJmIAJmIAJmMATEHBS8QRK9BRMwARMwARMwARMwARM4J4EnFTck77HNgETMAETMAETMAETMIEnIOCk4gmU6CmYgAmYgAmYgAmYgAmYwD0JOKm4J32PbQImYAImYAImYAImYAJPQMBJxRMo0VMwARMwARMwARMwARMwgXsScFJxT/oe2wRMwARMwARMwARMwASegICTiidQoqdgAiZgAiZgAiZgAiZgAvck4KTinvQ9tgmYgAmYgAmYgAmYgAk8AQEnFU+gRE/BBEzABEzABEzABEzABO5JwEnFPel7bBMwARMwARMwARMwARN4AgJOKp5AiZ6CCZiACZiACZiACZiACdyTgJOKe9L32CZgAiZgAiZgAiZgAibwBAScVDyBEj0FEzABEzABEzABEzABE7gnAScV96TvsU3ABEzABEzABEzABEzgCQg4qXgCJXoKJmACJmACJmACJmACJnBPAk4q7knfY5uACZiACZiACZiACZjAExBwUvEESvQUTMAETMAETMAETMAETOCeBJxU3JO+xzYBEzABEzABEzABEzCBJyDgpOIJlOgpmIAJmIAJmIAJmIAJmMA9CTipuCd9j20CJmACJmACJmACJmACT0DAScUTKNFTMAETMAETMAETMAETMIF7EnBScU/6HtsETMAETMAETMAETMAEnoCAk4onUKKnYAImYAImYAImYAImYAL3JOCk4p70PbYJmIAJmIAJmIAJmIAJPAEBJxVPoERPwQRMwARMwARMwARMwATuScBJxT3pe+z/IvDvf//7v777y3MR+P33359rQp6NCZiACZiACZjAnwSeNqn4+eef33777bc/J/rIJwTT33///V3l/ctf/vL2008/vVUDP+p++eWXb3DeVejzk08++UOOXX3u6Af9fP3118v6geVnn3329ve//32HGP/Txy+//PKG3v71r3/9z2+9C6yJr7766u0eCdynn376B8cVeXvzWL1etetWv/dg1ZLD10zABEzABEzgkQk8bVJBcPrRRx+9/fWvf10OBm+tMIKsDz744A95v/nmm6UgcZes8EIGjpWgj2SC+nyQeUchqVCfBMs7y5mgkoQPuQiKVxKEX3/99c/5YIe7i+T68MMP37777rtS9yQizIW1QftbFtghK58ff/zxlkP/4Qe+/fbbZV/wt7/97S7y3hSOBzMBEzABEzCBDQSeOqkgeOIO86MXJRVHAtddc1NSQdBZKQRbyMud+F1FSQV9nkkCsjz/+Mc/3j7++OM3gvwjBXmYK5+VQBzbow1B9M4nOpoDiQr9kyBUEkHakXxoLl988cVWzpJrdIyJ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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:e25f8f36-646e-456f-b3f1-b612a3e2aa86.png)!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(file_path, sep='\\t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userID</th>\n",
       "      <th>bookmarkID</th>\n",
       "      <th>tagID</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>437588</th>\n",
       "      <td>108035</td>\n",
       "      <td>30993</td>\n",
       "      <td>193</td>\n",
       "      <td>1277495315000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>437589</th>\n",
       "      <td>108035</td>\n",
       "      <td>30993</td>\n",
       "      <td>673</td>\n",
       "      <td>1277495315000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>437590</th>\n",
       "      <td>108035</td>\n",
       "      <td>30994</td>\n",
       "      <td>130</td>\n",
       "      <td>1277223715000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>437591</th>\n",
       "      <td>108035</td>\n",
       "      <td>30994</td>\n",
       "      <td>267</td>\n",
       "      <td>1277223715000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>437592</th>\n",
       "      <td>108035</td>\n",
       "      <td>30994</td>\n",
       "      <td>4943</td>\n",
       "      <td>1277223715000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        userID  bookmarkID  tagID      timestamp\n",
       "437588  108035       30993    193  1277495315000\n",
       "437589  108035       30993    673  1277495315000\n",
       "437590  108035       30994    130  1277223715000\n",
       "437591  108035       30994    267  1277223715000\n",
       "437592  108035       30994   4943  1277223715000"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1867"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(records.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用测试集，计算准确率和召回率\n",
    "def precisionAndRecall(N):\n",
    "    hit = 0\n",
    "    h_recall = 0\n",
    "    h_precision = 0\n",
    "    for user,items in test_data.items():\n",
    "        if user not in train_data:\n",
    "            continue\n",
    "        # 获取Top-N推荐列表\n",
    "        rank = recommend(user, N)\n",
    "        for item,rui in rank:\n",
    "            if item in items:\n",
    "                hit = hit + 1\n",
    "        h_recall = h_recall + len(items)\n",
    "        h_precision = h_precision + N\n",
    "    #print('一共命中 %d 个, 一共推荐 %d 个, 用户设置tag总数 %d 个' %(hit, h_precision, h_recall))\n",
    "    # 返回准确率 和 召回率\n",
    "    return (hit/(h_precision*1.0)), (hit/(h_recall*1.0))\n",
    "\n",
    "# 使用测试集，对推荐结果进行评估\n",
    "def testRecommend():\n",
    "    print(\"推荐结果评估\")\n",
    "    print(\"%3s %10s %10s\" % ('N',\"精确率\",'召回率'))\n",
    "    for n in [5,10,20,40,60,80,100]:\n",
    "        precision,recall = precisionAndRecall(n)\n",
    "        print(\"%3d %10.3f%% %10.3f%%\" % (n, precision * 100, recall * 100))\n",
    "        \n",
    "# 数据加载\n",
    "def load_data():\n",
    "    print(\"开始数据加载...\")\n",
    "    df = pd.read_csv(file_path, sep='\\t')\n",
    "    for i in range(len(df)):\n",
    "        uid = df['userID'][i]\n",
    "        iid = df['bookmarkID'][i]\n",
    "        tag = df['tagID'][i]\n",
    "        # 键不存在时，设置默认值{}\n",
    "        records.setdefault(uid,{})\n",
    "        records[uid].setdefault(iid,[])\n",
    "        records[uid][iid].append(tag)\n",
    "    print(\"数据集大小为 %d.\" % (len(df)))\n",
    "    print(\"设置tag的人数 %d.\" % (len(records)))\n",
    "    print(\"数据加载完成\\n\")\n",
    "\n",
    "# 将数据集拆分为训练集和测试集\n",
    "def train_test_split(ratio, seed=100):\n",
    "    random.seed(seed)\n",
    "    for u in records.keys():\n",
    "        for i in records[u].keys():\n",
    "            # ratio比例设置为测试集\n",
    "            if random.random()<ratio:\n",
    "                test_data.setdefault(u,{})\n",
    "                test_data[u].setdefault(i,[])\n",
    "                for t in records[u][i]:\n",
    "                    test_data[u][i].append(t)\n",
    "            else:\n",
    "                train_data.setdefault(u,{})\n",
    "                train_data[u].setdefault(i,[])\n",
    "                for t in records[u][i]:\n",
    "                    train_data[u][i].append(t)        \n",
    "    print(\"训练集样本数 %d, 测试集样本数 %d\" % (len(train_data),len(test_data)))\n",
    "\n",
    "# 设置矩阵 mat[index, item] = 1\n",
    "def addValueToMat(mat, index, item, value=1):\n",
    "    if index not in mat:\n",
    "        mat.setdefault(index,{})\n",
    "        mat[index].setdefault(item,value)\n",
    "    else:\n",
    "        if item not in mat[index]:\n",
    "            mat[index][item] = value\n",
    "        else:\n",
    "            mat[index][item] += value\n",
    "\n",
    "\n",
    "# 使用训练集，初始化user_tags, tag_items, user_items\n",
    "def initStat():\n",
    "    records=train_data\n",
    "    for u,items in records.items():\n",
    "        for i,tags in items.items():\n",
    "            for tag in tags:\n",
    "                #print tag\n",
    "                # 用户和tag的关系\n",
    "                addValueToMat(user_tags, u, tag, 1)\n",
    "                # tag和item的关系\n",
    "                addValueToMat(tag_items, tag, i, 1)\n",
    "                # 用户和item的关系\n",
    "                addValueToMat(user_items, u, i, 1)\n",
    "                # item喝tag的关系\n",
    "                addValueToMat(item_tags,i,tag,1)\n",
    "                # tag和用户的关系\n",
    "                addValueToMat(tag_users,tag,u,1)\n",
    "                # items和用户的关系\n",
    "                addValueToMat(item_users,i,u,1)\n",
    "    print(\"user_tags, tag_items, user_items初始化完成.\")\n",
    "    print(\"user_tags大小 %d, tag_items大小 %d, user_items大小 %d\" % (len(user_tags), len(tag_items), len(user_items)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对用户user推荐Top-N\n",
    "def recommend(user, N):\n",
    "    recommend_items=dict()\n",
    "    # 对Item进行打分，分数为所有的（用户对某标签使用的次数 wut, 乘以 商品被打上相同标签的次数 wti）之和\n",
    "    tagged_items = user_items[user]     \n",
    "    for tag, wut in user_tags[user].items():\n",
    "        #print(self.user_tags[user].items())\n",
    "        for item, wti in tag_items[tag].items():\n",
    "            if item in tagged_items:\n",
    "                continue\n",
    "                \n",
    "            # NormTagBased 算法\n",
    "            norm = len(tag_users[tag].items())*len(user_tags[user].items())\n",
    "            # TagBased-IDF 算法\n",
    "#             norm = math.log(len(tag_users[tag].items()) + 1)\n",
    "            #print('wut = %s, wti = %s' %(wut, wti))\n",
    "            if item not in recommend_items:\n",
    "                recommend_items[item] = wut * wti / norm \n",
    "            else:\n",
    "                recommend_items[item] = recommend_items[item] + wut * wti / norm\n",
    "    return sorted(recommend_items.items(), key=operator.itemgetter(1), reverse=True)[0:N]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始数据加载...\n",
      "数据集大小为 437593.\n",
      "设置tag的人数 1867.\n",
      "数据加载完成\n",
      "\n",
      "训练集样本数 1860, 测试集样本数 1793\n",
      "user_tags, tag_items, user_items初始化完成.\n",
      "user_tags大小 1860, tag_items大小 36884, user_items大小 1860\n"
     ]
    }
   ],
   "source": [
    "# 数据加载\n",
    "load_data()\n",
    "# 训练集，测试集拆分，20%测试集\n",
    "train_test_split(0.2)\n",
    "initStat()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "推荐结果评估\n",
      "  N        精确率        召回率\n",
      "  5      0.829%      0.355%\n",
      " 10      0.633%      0.542%\n",
      " 20      0.512%      0.877%\n",
      " 40      0.381%      1.304%\n",
      " 60      0.318%      1.635%\n",
      " 80      0.276%      1.893%\n",
      "100      0.248%      2.124%\n"
     ]
    }
   ],
   "source": [
    "# SimpleTagBased算法推荐结果\n",
    "testRecommend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "推荐结果评估\n",
      "  N        精确率        召回率\n",
      "  5      0.907%      0.388%\n",
      " 10      0.638%      0.546%\n",
      " 20      0.507%      0.868%\n",
      " 40      0.356%      1.218%\n",
      " 60      0.287%      1.476%\n",
      " 80      0.255%      1.750%\n",
      "100      0.241%      2.061%\n"
     ]
    }
   ],
   "source": [
    "# NormTagBased算法推荐结果\n",
    "testRecommend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "推荐结果评估\n",
      "  N        精确率        召回率\n",
      "  5      1.008%      0.431%\n",
      " 10      0.761%      0.652%\n",
      " 20      0.549%      0.940%\n",
      " 40      0.402%      1.376%\n",
      " 60      0.328%      1.687%\n",
      " 80      0.297%      2.033%\n",
      "100      0.269%      2.306%\n"
     ]
    }
   ],
   "source": [
    "# TagBased-TFIDF算法推荐结果\n",
    "testRecommend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.8.0 64-bit ('Bi_env': venv)",
   "language": "python",
   "name": "python38064bitbienvvenvba07af95a1bb4b078aa8134bba84dff2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
